package com.sjc.algorithm.array;

import java.util.Arrays;

/**
 * 《漫画算法》数组 操作
 * @author by SangJiacun
 * @Date 2020/5/10 10:06
 */
public class ArrayDemo {

    public static void main(String[] args) throws Exception {
        // 读取元素
        int[] arr = new int[]{3,5,11,76,42,87,97,45,34};
        System.out.println(arr[3]);

        // 更新元素
        arr[3] = 99;
        System.out.println(arr[3]);

        // 插入元素
        System.out.println(Arrays.toString(arr));
        int[] arr1 = saveArray(arr, 1, 111);
        int[] arr2 = saveArray(arr1, 2, 222);
        int[] arr3 = saveArray(arr2, 3, 333);
        int[] arr4 = saveArray(arr3, 4, 444);
        System.out.println(Arrays.toString(arr4));

        // 删除元素
        int[] arr5 = removeByIndex(arr4, 5);
        int[] arr6 = removeByIndex(arr5, 5);
        int[] arr7 = removeByIndex(arr6, 5);
        int[] arr8 = removeByIndex(arr7, 5);
        System.out.println(Arrays.toString(arr8));
    }

    /**
     * 插入新元素到数组中
     * @param arr  原数组
     * @param index 新元素要插入的位置
     * @param value 新元素的值
     */
    public static int[] saveArray(int[] arr, int index, int value) throws Exception{

        if(index < 0 || index > arr.length){
            throw new IndexOutOfBoundsException("新元素插入的位置超过了数组实际范围!");
        }

        int size = arr.length;
        // 数组最后1个元素有值，则扩容
        if(arr[arr.length-1] != 0){
            int[] newArr = resize(arr);
            arr = newArr;
        }

        // 从index位置开始的元素一次向后移位
        for(int i=size-1; i>index; i--){
            arr[i] = arr[i-1];
        }

        // 将 value 赋值给 index位置的值
        arr[index] = value;
        return arr;
    }

    /**
     * 数组扩容
     * 新数组长度 = 原数组的长度 * 2
     * @param arr 原数组
     * @return 扩容后的数组
     */
    public static int[] resize(int[] arr){
        int[] newArr = new int[arr.length * 2];
        System.arraycopy(arr,0,newArr,0,arr.length);
        return newArr;
    }

    /**
     * 移除指定位置的元素
     * @param arr 原数组
     * @param index 指定位置
     * @return 删除指定位置元素后的 新数组
     */
    public static int[] removeByIndex(int[] arr, int index) throws Exception{
        if(index <0 || index > arr.length){
            throw new IndexOutOfBoundsException("删除元素的位置超过了数组实际的范围！");
        }

        for(int i=index;i< arr.length-1;i++){
            arr[i] = arr[i+1];
        }
        return arr;
    }
}
